/*
Driver.java
Fecha: 21 de julio de 2011
Autor: Claudia Grajeda
Descripcion: aplicacion de colas y pilas
*/


import java.util.Scanner;
import java.util.InputMismatchException;


/**
 * @author Claudia Grajeda
 *
 */
public class Driver{ 

	
	public static void main (String[] args){
	
		//Declaracion de objetos
		Scanner datos = new Scanner(System.in);
		Stack<Double> stack = new Stack<Double>();
		Lista<Double> cola = new Lista<Double>();
		
		//variables
		int opcion, subopcion, ingreso, cantidad;
		double numero, num1, num2, num3;
		ingreso = 0;
		//------------
		
		//Escojer el uso de stacks o de colas
		System.out.println("\n   HOJA 2 POSTFIX! :O)\n");
		do{
			cantidad = (int)obtenerNumero("Ingrese:  1. Pila.\n          2. para Cola \n", false);
			if ((cantidad<0) || (cantidad>2))
				System.out.println("ERROR, INGRESO INVALIDO");
			if (cantidad ==1){
				System.out.println("\n             PILA\n");
			}
			if (cantidad ==2){
				System.out.println("\n LISTA SIMPLEMENTE ENCADENADA\n");
			}
			
		}
		while ((cantidad<0) || (cantidad>2));
		
		
		do{
            menu();
            //-----------------------------------------------------
            opcion = (int)obtenerNumero("QUE DESEA INGRESAR? ", false);
            if (opcion < 0)
                opcion = 0;
            //-----------------------------------------------------
            switch(opcion){
                case 1://ingresar de un dato, que va a ser operado
					if (ingreso <2){//se necesitan minimo 2 numeros
						System.out.println("\n Ingrese un dato  ");
						numero = datos.nextDouble();
						datos.nextLine();
						if (cantidad ==1){
							stack.anadir(numero);
							System.out.println(stack.toString());
						}
						else{
							cola.anadir(numero);
							System.out.println(cola.toString());
						}
						ingreso++;
					}
					else{
						System.out.println("\n----> A ingresado suficientes datos, elija una operacion  ");
					}
					break;
				
				case 2: //ingresar operacion
						if (ingreso ==2){ //si hay 2 numeros continuar, de lo contrario mensaje de error
							System.out.println("| 1. Sumar     2. Restar     3. Multiplicar     4. Dividir  |");
							subopcion = datos.nextInt();
							datos.nextLine();
							
							switch(subopcion){
								case 1: // suma
									System.out.println("\n SUMA:  \n");
									if (cantidad ==1){
										num1 = stack.quitar(); 					// obtener el ultimo numero o el que saldria
										num2 = stack.quitar(); 					// sacar el ultimo numero ingresado
										num3 = stack.sumar(num1,num2); 			//sumar numeros
										stack.anadir(num3);						//agrega num3 al arreglo
										System.out.println(num3);				//imprime resultado de suma
										System.out.println(stack.toString());	//imprime arreglo
									}
									else{
										num1 = cola.quitar();					// obtener primer numero de la cola
										num2 = cola.quitar(); 					// obtener segundo numero de la cola
										num3 = cola.sumar(num1,num2); 			//sumar numeros 
										cola.borrar();							//borra todos los elementos de la lista
										cola.anadir(num3);						//agrega num3 al arreglo
										System.out.println(num3);				//imprime resultado de suma
										System.out.println(cola.toString());	//imprime arreglo
									}
									
									break;
								case 2://resta
									System.out.println("\n RESTA: \n");
									if (cantidad ==1){
										num2 = stack.quitar(); 					// obtener el ultimo numero o el que saldria
										num1 = stack.quitar(); 					// sacar el ultimo numero ingresado
										num3 = stack.restar(num1,num2); 		//restar numeros  num2-num1
										stack.anadir(num3);						//agrega num3 al arreglo
										System.out.println(num3);				//imprime resultado de suma
										System.out.println(stack.toString());	//imprime arreglo
									}
									else{
										num2 = cola.quitar();					// obtener primer numero de la cola
										num1 = cola.quitar(); 					// obtener segundo numero de la cola
										num3 = cola.restar(num1,num2); 			//restar numeros num2-num1
										cola.borrar();							//borra todos los elementos de la lista
										cola.anadir(num3);						//agrega num3 al arreglo
										System.out.println(num3);				//imprime resultado de suma
										System.out.println(cola.toString());	//imprime arreglo
									}
									
									break;
								case 3://multiplica
									System.out.println("\n MULTIPLICACION: \n");
									if (cantidad ==1){
										num2 = stack.quitar(); 					// obtener el ultimo numero o el que saldria
										num1 = stack.quitar(); 					// sacar el ultimo numero ingresado
										num3 = stack.multiplicar(num1,num2); 	//restar numeros  num1*num2
										stack.anadir(num3);						//agrega num3 al arreglo
										System.out.println(num3);				//imprime resultado de suma
										System.out.println(stack.toString());	//imprime arreglo
									}
									else{
										num2 = cola.quitar();					// obtener primer numero de la cola
										num1 = cola.quitar(); 					// obtener segundo numero de la cola
										num3 = cola.multiplicar(num1,num2); 	//restar numeros num1*num2
										cola.borrar();							//borra todos los elementos de la lista
										cola.anadir(num3);						//agrega num3 al arreglo
										System.out.println(num3);				//imprime resultado de suma
										System.out.println(cola.toString());	//imprime arreglo
									}
									break;
								case 4://divide
									System.out.println("\n DIVICION: \n");
									if (cantidad ==1){
										num2 = stack.quitar(); 					// obtener el ultimo numero o el que saldria
										num1 = stack.quitar(); 					// sacar el ultimo numero ingresado
										num3 = stack.dividir(num1,num2); 	//restar numeros  num1/num2
										stack.anadir(num3);						//agrega num3 al arreglo
										System.out.println(num3);				//imprime resultado de suma
										System.out.println(stack.toString());	//imprime arreglo
									}
									else{
										num2 = cola.quitar();					// obtener primer numero de la cola
										num1 = cola.quitar(); 					// obtener segundo numero de la cola
										num3 = cola.dividir(num1,num2); 		//restar numeros num1/num2
										cola.borrar();							//borra todos los elementos de la lista
										cola.anadir(num3);						//agrega num3 al arreglo
										System.out.println(num3);				//imprime resultado de suma
										System.out.println(cola.toString());	//imprime arreglo
									}
									
									break;
													
								default:
									System.out.println("\nERROR: ~~> Opcion invalida. :O(\n");            
								
								break;
							}
							ingreso--;
						}
						else {
							System.out.println("\n debe de ingresar un datos mas \n");
						}
					break;
				
				case 3: //cambiar de implementacion
					if (cantidad ==1){
						cantidad = 2;
						System.out.println("\n LISTA SIMPLEMENTE ENCADENADA\n");
					}
					else{
						if (cantidad ==2){
							cantidad =1;
							System.out.println("\n             PILA\n");
						}
					}
					ingreso =0;
					break;
				
				case 4: //salir
					System.out.println("\nBye! :O)\n");
					break;
					
				default:
                    System.out.println("\nERROR: ~~> Opcion invalida. :O(\n");            
            }
        }while(opcion!=4);
	}
	
	
	
	//menu de opciones
	public static void menu(){
		System.out.println();
        System.out.println("+--    MENU DE OPCIONES    --+");
        System.out.println("| 1. Ingresar un dato        |");
		System.out.println("| 2. Ingresar una operacion  |");
        System.out.println("| 3. Cambiar tipo de arreglo |");
		System.out.println("| 4. Salir del programa      |");
		System.out.println("+----------------------------+");
	}
	
	
	//obtener numero
	public static double obtenerNumero(String mensaje, boolean mostrar){
		Scanner ingreso = new Scanner(System.in);
		double num = -1;
			
		System.out.print(mensaje);
		try{
			num = ingreso.nextDouble();
		}
		catch(InputMismatchException exception){
			if (mostrar)
				System.out.println("\nERROR: ~~> Dato invalido. :O(\n");
		}
		finally{
			ingreso.nextLine();//Atrapar el ENTER
		}
		return num;
	}
}